class Rational{
public:
Rational(int numerator=0, int denominator=1);
private:
int n, d;
friend const Rational operator*(const Rational& lhs, const Rational& rhs);
};
위의 operator*는 const Rational을 반환한다.
만일 operator*가 const Rational&를 반환하는 경우,
const Rational& operator*(const Rational& lhs, const Rational& rhs){
Rational result(lhs.n*rhs.n, lhs.d*rhs.d);
return result;
}
위와 같이 지역 변수인 result의 레퍼런스(포인터)를 반환하게 된다.(의도치 않은 동작을 야기할 수 있음)
동적(new)으로 힙에 할당해준 값을 레퍼런스로 리턴해줄 경우,
스코프 밖에서 소멸되지는 않지만 delete를 해 줄 수 없다.
정적(static)으로 선언된 변수를 리턴해줄 경우,
스레드 안정성 문제가 야기되며,
bool operator==(const Rational& lhs. const Rational& rhs);
Rational a, b, c, d;
if((a*b)==(c*d)){
} else {
}
위와 같이 static으로 선언된 값은 서로 공유되기 때문에 연산 결과값이 항상 동일하게 된다.
inline const Rational operator*(const Rational& lhs, const Rational& rhs){
return Rational(lhs.n*rhs.n, lhs.d*rhs.d);
}
위와 같이 inline으로 리턴값을 직접 생성하여 사용할 경우,
컴파일러 구현자들 최적화를 수행하며, 반환값에 대한 생성자와 소멸자를 안전하게 제거하여 동작된다.
지역 정적 객체에 대해 참조자로 반환할 때,
static으로 선언된 객체를 참조자로 반환한다. 이는 최소한 단일 스레드 환경에서만 안전하게 동작할 수 있다.